{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3f0a2181-4a21-45f4-b974-7b478243359e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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yrpSPrdzcMZi2SOn2SSv2eK6mk2FrpkKVp2+9tpr8dRTT8W//uu/plqvvLw8zjzzzFi3bl27y1RUVERFRUWb6zqZvac8ee+2Au/+bUrnxYjWsfeS14xxrGaTvGaPnGZHKV9XS3k8U2illEfaVsiaKULdlHWlfG6nYxyr2SOn2SSv2eC6mk2FzmOPQm34vvvuiyFDhsTFF1+car2mpqb41a9+FTU1NQWKDAAAoPjUTAAAULoK0lxpbm6O++67L6666qro1av1uwuvvPLKmDNnTsvjW265JZ588sn4z//8z1i5cmV89rOfjddeey0+97nPFSI0AACAolMzAQBAaSvIfRWeeuqp2LRpU/zJn/zJAfM2bdoUPXq819P5/e9/H5///Oejvr4+jj322Bg3blwsXbo0Ro0aVYjQAAAAik7NBAAApa0gzZWLLrookiRpc97TTz/d6vGdd94Zd955ZyHCAAAA6JLUTAAAUNoK9p0rAAAAAAAAWaS5AgAAAAAAkILmCgAAAAAAQAqaKwAAAAAAAClorgAAAAAAAKSguQIAAAAAAJCC5goAAAAAAEAKmisAAAAAAAApaK4AAAAAAACkoLkCAAAAAACQguYKAAAAAABACporAAAAAAAAKWiuAAAAAAAApKC5AgAAAAAAkILmCgAAAAAAQAqaKwAAAAAAAClorgAAAAAAAKSguQIAAAAAAJCC5goAAAAAAEAKmisAAAAAAAApaK4AAAAAAACkoLkCAAAAAACQguYKAAAAAABACporAAAAAAAAKWiuAAAAAAAApKC5AgAAAAAAkILmCgAAAAAAQAqaKwAAAAAAAClorgAAAAAAAKSguQIAAAAAAJCC5goAAAAAAEAKmisAAAAAAAApaK4AAAAAAACkoLkCAAAAAACQQt6bKzfffHOUlZW1+hk5cuRB13nooYdi5MiRUVlZGaeffno89thj+Q4LAACgS1AzAQBA6SvIJ1dOO+20qKura/l57rnn2l126dKlMWPGjLj22mvjpZdeiunTp8f06dNj9erVhQgNAACg6NRMAABQ2grSXOnVq1dUV1e3/AwaNKjdZf/hH/4hpk6dGl/60pfi1FNPjVtvvTXOOuusuOuuuwoRGgAAQNGpmQAAoLT1KsRG165dG8OGDYvKysqYOHFizJs3L4477rg2l122bFnMnj271bQpU6bEI4880u72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qeSaK3v27InLL788rr/++oMud99990VdXV3Lz/Tp01vmbdiwIS6++OI4//zzY9WqVXHDDTfE5z73uXjiiScKHD1tOVROm5qa4uKLL449e/bE0qVL4wc/+EEsWLAgbrzxxpZl5LQ03HLLLa2Oyz//8z9vmdfQ0BAXXXRRHH/88bFixYq444474uabb47vfe97RYyYg/nRj34Us2fPjptuuilWrlwZY8aMiSlTpsSbb75Z7NDooNNOO63VMfncc8+1zPurv/qrePTRR+Ohhx6KZ555Jt5444345Cc/WcRoacvOnTtjzJgxMX/+/Dbn33777fGd73wn7rnnnnjhhRfi6KOPjilTpsTu3btblvnMZz4TL7/8ctTW1sbPfvazePbZZ+O6667rrF3gfQ6V04iIqVOntjp2f/jDH7aaL6eombJJ3dR9qJuyRd1U+tRNpU3NlE1dpm5KStR9992X9OvXr815EZE8/PDD7a775S9/OTnttNNaTbviiiuSKVOm5DFC0movp4899ljSo0ePpL6+vmXa3XffnfTt2zdpbGxMkkROS8Hxxx+f3Hnnne3O/+53v5sce+yxLTlNkiT567/+6+SUU07phOg4HOPHj09mzpzZ8ripqSkZNmxYMm/evCJGRUfddNNNyZgxY9qct23btqS8vDx56KGHWqa9+uqrSUQky5Yt66QISev945/m5uakuro6ueOOO1qmbdu2LamoqEh++MMfJkmSJK+88koSEckvfvGLlmUef/zxpKysLPntb3/babHTtrbGtFdddVVy6aWXtruOnLI/NVM2qZuyTd2UPeqm0qZuyhY1UzYVs24quU+udNTMmTNj0KBBMX78+Lj33nvj3b/zu5YtWxaTJk1qtfyUKVNi2bJlnR0mHbBs2bI4/fTTY+jQoS3TpkyZEg0NDfHyyy+3LCOnXd9tt90WAwcOjDPPPDPuuOOOVrcoWLZsWXz84x+P3r17t0ybMmVKrFmzJn7/+98XI1wOYs+ePbFixYpWx12PHj1i0qRJjrsSsnbt2hg2bFiceOKJ8ZnPfCY2bdoUERErVqyIXC7XKr8jR46M4447Tn5LyIYNG6K+vr5VHvv16xcTJkxoyeOyZcuif//+8Qd/8Acty0yaNCl69OgRL7zwQqfHTMc8/fTTMWTIkDjllFPi+uuvjy1btrTMk1PSUDNli7opO9RN2aFu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\n",
      "text/plain": [
       "<Figure size 2000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "import numpy as np  # 导入 numpy 库，用于进行数学计算\n",
    "import matplotlib.pyplot as plt  # 导入 matplotlib.pyplot 库，用于绘制图形\n",
    "import math  # 导入 math 库，用于数学计算\n",
    "\n",
    "# 定义一个函数，用于生成正弦波\n",
    "def getSin(amp, freq, phase, sampleList):\n",
    "    return amp * np.sin(-2 * math.pi * freq * sampleList + phase)\n",
    "\n",
    "# 定义一个函数，用于生成余弦波\n",
    "def getCos(amp, freq, phase, sampleList):\n",
    "    return amp * np.sin(-2 * math.pi * freq * sampleList + phase)\n",
    "\n",
    "\n",
    "\n",
    "# 1. 获得混合波形\n",
    "srate = 3000  # 设置采样率为 3000\n",
    "t = np.linspace(0, 1, srate)  # 在 0 到 1 的范围内生成等间距的采样点\n",
    "\n",
    "# 分别生成4个波\n",
    "s1 = getSin(amp=1.5, freq=30, phase=0, sampleList=t)\n",
    "c1 = getCos(amp=3, freq=5, phase=0, sampleList=t)\n",
    "s2 = getSin(amp=10, freq=100, phase=0, sampleList=t)\n",
    "c2 = getCos(amp=20, freq=120, phase=0, sampleList=t)\n",
    "\n",
    "m = s1 + c1 + s2 + c2  # 将4个波相加，得到混合波形\n",
    "\n",
    "# 2. 获得傅里叶系数\n",
    "fCoefs = np.fft.fft(m,srate)  # 创建一个复数类型的数组，用于存储傅里叶系数\n",
    "\n",
    "# 循环计算每一个频率的傅里叶系数\n",
    "#for f in range(srate):\n",
    "#    p = m * np.exp(-1j * 2 * math.pi * f * t)  # 计算傅里叶积分的被积函数\n",
    "#    fCoefs[f] = np.sum(p)  # 对被积函数求和，得到傅里叶系数\n",
    "\n",
    "amp_list=2*np.abs(fCoefs/srate)#获得振幅列表：每一个绕线的重心到原点的距离再乘以2\n",
    "\n",
    "\n",
    "freqs = np.fft.fftfreq(len(amp_list), 1/srate)# 把频率轴从0~300 转变成 0~149 然后 -150~-1\n",
    "\n",
    "amp_shifted=np.fft.fftshift(amp_list)#通过np.fft.fftshift方法把 频率轴 和 数据 都变成 0hz 在中间，向左是负频率，向右是正频率的形式\n",
    "freq_shift=np.fft.fftshift(freqs)\n",
    "\n",
    "amp_shiftedz=np.copy(amp_shifted)\n",
    "amp_shiftedz[(freq_shift>110) | (freq_shift<-110)]=0  #去除频率大于110hz和小于-110hz的噪音\n",
    "\n",
    "mask=(amp_shiftedz>=1.5)\n",
    "amp_shifted1=mask*amp_shiftedz\n",
    "\n",
    "\n",
    "# 把振幅列表画出来\n",
    "fg,ax=plt.subplots(1,2,figsize=(20,5))\n",
    "ax[0].grid()\n",
    "ax[0].stem(freq_shift,amp_shifted)\n",
    "ax[0].set_xlim([-150,150])\n",
    "ax[0].set_ylim([-0.5,21])\n",
    "\n",
    "\n",
    "\n",
    "# 把振幅列表画出来\n",
    "ax[1].grid()\n",
    "ax[1].stem(freq_shift,amp_shifted1) #注意：由于频率有负值，所以振幅被平分了，需要乘以2才能还原原始振幅\n",
    "ax[1].set_xlim([-150,150])\n",
    "ax[1].set_ylim([-0.5,21])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "31e1b13d-4174-41fb-b5fb-e93f1872037d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
